import Axios from './axios'
import store from '../store/index'
import api from '../config'
import Taro from '@tarojs/taro'
import type { AxiosRequestConfig } from 'axios'

interface RequestConfig extends AxiosRequestConfig {
  showErrMsg: boolean
}

// 全局请求接口配置信息
export const service = Axios.create({
  baseURL: api.url,
  timeout: 60 * 1000,
  headers: {
    'Content-Type': api.contentType
  }
})

// Request拦截器
service.interceptors.request.use(
  config => {
    config.loading !== false && Taro.showLoading({ title: '加载中' })
    // 注入token
    if (store.getters.token) {
      config.headers['token'] = store.getters.token
    }
    return config
  },
  err => {
    return Promise.reject(err)
  }
)

const { isOK, msg, code, data, errorCodes, errorCallback } = api.responseConfig

// Response拦截器
service.interceptors.response.use(
  response => {
    // 处理关闭loading
    Taro.hideLoading()
    // axios默认请求判断状态
    // 成功过滤处理，返回数据对象，属性信息走配置文件的配置
    if (!isOK(response.data) || errorCodes.indexOf(response.data[code]) >= 0) {
      // 请求出错，统一处理
      if ((response.config as RequestConfig).showErrMsg !== false) {
        Taro.showToast({ title: `${response.data[msg] || '请求数据出错'}`, icon: 'none' })
        setTimeout(() => {
          if (errorCodes.includes(response.data[code])) {
            errorCallback()
          }
        }, 1200)
      }
      return Promise.reject(response.data)
    } else {
      if (response.config.url && response.config.url.indexOf('examQuestionList') > -1) {
        return Promise.resolve(response.data)
      }
      return Promise.resolve(response.data[data])
    }
  },
  error => {
    // 处理关闭loading
    Taro.hideLoading()
    if (error.response) {
      // 处理错误状态码
      switch (error.response.status) {
        case 401:
          break
        default:
          break
      }
      return Promise.reject(error.response.data)
    }
    return Promise.reject(error)
  }
)

export default service.request
